package com.study.goal.service;

import com.study.common.core.page.TableDataInfo;
import com.study.goal.domain.PlanOccurrence;
import com.study.goal.domain.bo.PlanOccurrenceBo;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

public interface IPlanOccurrenceService {

    /**
     * 创建执行计划
     * @param occurrence
     * @return
     */
    Boolean create(PlanOccurrenceBo occurrence);

    /**
     * 开始执行
     * @param id
     * @return
     */
    Boolean start(Long id);

    /**
     * 提交执行
     * @param id
     * @return
     */
    Boolean submit(Long id);

    /**
     * 家长审核确认完成
     * @param id
     * @return
     */
    Boolean approve(Long id);

    /**
     * 家长审核拒绝
     * @param id
     * @return
     */
    Boolean reject(Long id);

    /**
     * 标记为未完成
     * @param id
     * @return
     */
    Boolean markMissed(Long id);

    /**
     * 获取某个 assignment 的所有执行计划
     * @param assignmentId
     * @return
     */
    TableDataInfo<PlanOccurrence> listByAssignment(Long assignmentId);

    /**
     * 获取某个 assignment 在某个日期的
     * @param assignmentId
     * @param date
     * @return
     */
    List<PlanOccurrence> listByAssignmentAndDate(Long assignmentId, LocalDateTime date);

    /**
     * 获取某个学生的某个日期的
     * @param userId
     * @param date
     * @return
     */
    List<PlanOccurrence> studentListByDate(Long userId, LocalDateTime date);

    /**
     *
     * @param assignmentId
     * @param generateFullRange 是否生成 plan.startDate -> plan.endDate 全范围（true）
     *      *                          否则只生成从 today 到 today + days 的 occurrence
     * @param days days 当 generateFullRange=false 时，生成未来 days 天
     */
    void generateOccurrencesForAssignment(Long assignmentId, boolean generateFullRange, int days);


    /**
     * 定时任务调用，为所有 active assignment 生成未来 N 天 occurrence
     * @param days
     */
    void generateOccurrencesForAllAssignments(int days);

    /**
     * 批量标记为未完成
     * @return
     */
    int markMissedOccurrences();
}
